let util = {};
let vueObj = undefined;

util.formatDate = function(date, fmt) {
	if (date == undefined) {
		return '';
	}
	let myDate = new Date(date)
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, (myDate.getFullYear() + '').substr(4 - RegExp.$1.length));
	}
	let o = {
		'M+': myDate.getMonth() + 1,
		'd+': myDate.getDate(),
		'h+': myDate.getHours(),
		'm+': myDate.getMinutes(),
		's+': myDate.getSeconds()
	};
	for (let k in o) {
		if (new RegExp(`(${k})`).test(fmt)) {
			let str = o[k] + '';
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
		}
	}
	return fmt;
};
//将1600840718000 转换为yyyy-MM-dd hh:mm
util.formatNumberToDate = function(time) {
	var date = new Date(time);
	var yy = date.getFullYear(); //年份
	var mm = date.getMonth() + 1; //获得月份
	mm = mm < 10 ? "0" + mm : mm; //月份小于10时，前面加个0(例如9 ->09)天，小时，分钟，秒同理
	var dd = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); //天
	var hours =
		date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); //小时
	var minutes =
		date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); //分钟
	var newDate =
		yy + "-" + mm + "-" + dd + " " + hours + ":" + minutes;

	return newDate;
};
// 得到上周日期范围
util.getLastWeekRange = function() {
	let timestamp = new Date().getTime(),
		lastWeek = new Date(timestamp - 7 * 24 * 60 * 60 * 1000),
		day = lastWeek.getDay(),
		startDate,
		endDate;
	if (day === 0) { // 如果7天前这一天是周日
		startDate = util.formatDate(new Date(lastWeek.getTime() - 6 * 24 * 60 * 60 * 1000), 'yyyy-MM-dd');
		endDate = util.formatDate(lastWeek, 'yyyy-MM-dd');
	} else {
		startDate = util.formatDate(new Date(lastWeek.getTime() - (day - 1) * 24 * 60 * 60 * 1000), 'yyyy-MM-dd');
		endDate = util.formatDate(new Date(lastWeek.getTime() + (6 - day + 1) * 24 * 60 * 60 * 1000), 'yyyy-MM-dd');
	}
	return [startDate, endDate];
};

util.getLastMonthRange = function() {
	let date = new Date(),
		month = date.getMonth(),
		lastMonth = new Date(new Date(date.getFullYear(), month, 1) - 24 * 60 * 60 *
			1000); // 上个月的最后一天日期 = 当月第一天的前一天
	let startDate = util.formatDate(new Date(lastMonth.getFullYear(), lastMonth.getMonth(), 1), 'yyyy-MM-dd');
	let endDate = util.formatDate(lastMonth, 'yyyy-MM-dd');
	return [startDate, endDate];
};

util.getLastQuarterRange = function() {
	let quarterList = [
		[0, 1, 2],
		[3, 4, 5],
		[6, 7, 8],
		[9, 10, 11]
	];
	let date = new Date(),
		year = date.getFullYear(),
		month = date.getMonth();
	let qIndex = -1; // 当前月在第几个季度的索引
	let startDate;
	let endDate;
	quarterList.forEach((q, index) => {
		if (q.findIndex(m => m === month) > -1) {
			qIndex = index;
		}
	});
	switch (qIndex) {
		// 去年的第四季度
		case 0:
			startDate = util.formatDate(new Date(year - 1, 9, 1), 'yyyy-MM-dd');
			endDate = util.formatDate(new Date(year - 1, 11, 31), 'yyyy-MM-dd');
			break;
			// 今年的第一季度
		case 1:
			startDate = util.formatDate(new Date(year, 0, 1), 'yyyy-MM-dd');
			endDate = util.formatDate(new Date(year, 2, 31), 'yyyy-MM-dd');
			break;
			// 今年的第二季度
		case 2:
			startDate = util.formatDate(new Date(year, 3, 1), 'yyyy-MM-dd');
			endDate = util.formatDate(new Date(year, 5, 30), 'yyyy-MM-dd');
			break;
			// 今年的第三季度
		case 3:
			startDate = util.formatDate(new Date(year, 6, 1), 'yyyy-MM-dd');
			endDate = util.formatDate(new Date(year, 8, 30), 'yyyy-MM-dd');
			break;
	}
	return [startDate, endDate];
};

// //主表：批量查询数据字典数据
// util.queryDictList = function(code, successCallBack) {
// 	var param = [];
// 	let dictDetailList = undefined;
// 	//各个字段关联的数据字典集合
// 	var obj_1 = {};
// 	obj_1.code = code; //服务商数据字典编码
// 	param.push(obj_1);
// 	util.ajax({
// 		method: 'POST',
// 		url: '/zsplat-metadata/zsSysDictMain/queryDetailAll',
// 		data: {
// 			dataArr: param
// 		}
// 	}).then(res => {
// 		successCallBack && successCallBack(res)
// 	});
// };

// //主表：批量查询数据字典数据
// util.queryDictValue = function(list, code) {
// 	let name = "";
// 	list.forEach(function(obj, index) {
// 		if (obj.code == code) {
// 			name = obj.name;
// 		}
// 	})
// 	return name;
// };
util.toMoney = function toMoney(num) {
	num = Number(num)
	num = num.toLocaleString('zh', {
		style: 'currency',
		currency: 'CNY'
	})
	// num =  Number(num).toFixed(2);;
	// num = parseFloat(num)
	// num = num.toLocaleString();
	return num; //返回的是字符串, 保留2位小数
}


//服务鉴权
util.checkPermission = function(code) {
	let hasPermission = false;
	let permissionsCache = JSON.parse(sessionStorage.getItem("permissionsCache"));
	if (permissionsCache != undefined && permissionsCache.contains(code)) {
		hasPermission = treu;
	}
	return hasPermission;
}
//获得系统参数
util.getSystemParam = function(paCode) {
	let content = '';
	let commonParamCache = JSON.parse(sessionStorage.getItem("commonParamCache"));
	if (commonParamCache != undefined) {
		content = commonParamCache[paCode];
	}
	if (content == undefined) {
		content = '';
	}
	return content;
}

util.isEmpty = object => {
	let flag = false;
	if (object === null || object === '' || object === undefined) {
		flag = true;
	}
	return flag;
};

function padLeftZero(str) {
	return ('00' + str).substr(str.length);
};


/**
 * 防抖函数的常用场景: ajax请求数据  提交数据  输入验证
 *
 * @params triggerNow: 是否马上触发防抖函数
 * @description: ajax请求数据首次不需要延迟， 输入验证首次应该防抖
 *
 *
 * 1. 是否首次延迟执行
 * 2. n秒之内 触发事件不执行事件处理函数(n秒之内频繁触发事件，计时器会频繁重新开始计时)
 */
util.zsDebounce = function(fn, time, triggerNow) {
	let t = null;

	let debounced = (...args) => {
		const _self = this;

		if (t) {
			clearTimeout(t);
		}

		if (triggerNow) {
			// 这种情况保证第一次不延迟，而且一秒内一直进来都不会触发
			let exec = !t;
			t = setTimeout(function() {
				t = null;
			}, time);

			if (exec) {
				fn.apply(_self, args);
			}
		} else {
			// 和上面的if(t){}判断配合，保证第一次延迟执行
			t = setTimeout(function() {
				fn.apply(_self, args);
			}, time);
		}
	}

	debounced.remove = function() {
		clearTimeout(t);
		t = null;
	}

	return debounced;
};

//密码验证， 必须有四种中三种 tx
util.validatePassRule = function(str) {
	// 写出数字、大小写字母、字符这4种正则表达式
	const rC = {
		lw: '[a-z]',
		uw: '[A-Z]',
		nw: '[0-9]',
		rw: '[\\u0020-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]'
	}

	// 写出正则校验函数
	function Reg(str, rStr) {
		const reg = new RegExp(rStr);
		if (reg.test(str)) {
			return true;
		} else {
			return false;
		}
	}

	// 封装
	const tR = {
		l: Reg(str, rC.lw),
		u: Reg(str, rC.uw),
		n: Reg(str, rC.nw),
		r: Reg(str, rC.rw)
	}
	// 校验
	if (!str) {
		return false;
	} else {
		if ((tR.l && tR.u && tR.n) || (tR.l && tR.u && tR.r) || (tR.r && tR.u && tR.n) || (tR.r && tR.l && tR.n)) {
			return true;
		} else {
			return false;
		}
	}
};

export default util;
